# -*-coding:utf-8-*-
# coding:utf-8
from utils import read_txt,cut_sent,read_hed,read_word
from Syntactic_Analysis import ParseResult
from collections import Counter


'''
待完成：
用“有”表示比较
（1）主||“有/没有”+宾（+“那么/这么”）+形
（2）主||“有/没有”+宾（+“那么/这么”）+动+宾
（3）主||动（+宾+重复的动词）+“得”+“有/没有”+宾（+“那么/这么”）+形
（4）主||“有/没有”+宾+动（+宾+重复的动词）+“得”+（+“那么/这么”）+形
（5）主||“有/没有”+宾+主谓词组
难点：规则的方法难以和“有”字句区分开
'''


'''
判定条件
'''
def judge_type(hed_info, modifi_info, fenci_res, pos_res):

    cmp_info = modifi_info['cmp_info']  # CMP成分
    adv_info = modifi_info['adv_info']  # ADV成分
    vob_info = modifi_info['vob_info']  # VOB成分
    mt_info  = modifi_info['mt_info']   # MT成分
    att_info = modifi_info['att_info']  # ATT成分
    pob_info = modifi_info['pob_info']  # POB成分

    type_lst = ['主||“（不）比”+宾+形', '主||“比”+宾+状+形',
                '主||“比”+形+补', '主||比+宾+主谓词组',
                '主||+比+宾+动+宾', '主||+比+宾+动+得+宾', '主||+动+宾+比+宾+重复的动词+得+形', '主||+动（+宾+重复的动词）+得+比+宾+形', '主||+比+宾+状[多/少/早/晚/先]+动（+宾/补）',
                '主||“跟”+宾+“一样”', '主||“跟”+宾+“一样”+形/动词词组', '主||动（+宾+重复的动词）+“得”+“跟”+宾+“一样”+形',
                '主 ||“不如”+宾', '主 ||“不如”+形/形容词词组/动词词组/主谓词组',
                '其他句型']

    verb_lst = ['v', 'vd', 'vn']
    adj_lst = ['a', 'ad', 'an']
    noun_lst = ['n', 'f', 's', 't', 'nr', 'ns', 'nt', 'nw', 'nz', 'r', 'an', 'vn', 'PER']

    type_id = len(type_lst) - 1

    # 寻找作为ADV的”比“
    adv_bi = read_word(adv_info, ['比'])
    if adv_bi:
        # 形容词被识别为HED
        if (hed_info['pos'] in adj_lst):
            # 主||比+宾+状[还/更/都]+形---找作为ADV的“还 / 更 / 都”
            if read_word(adv_info, ['还', '更', '都']):
                type_id = 1
                return type_lst[type_id]
            # 主||比+宾+主谓词组----主谓词组中谓语作“比”的POB，主语作谓语的ATT
            if read_hed(pob_info, adv_bi['word']) and read_hed(att_info, read_hed(pob_info, adv_bi['word'])['word']):
                type_id = 3
                return type_lst[type_id]
            # 主||比+宾+形+补---寻找作为CMP的补语
            if cmp_info:
                type_id = 2
                return type_lst[type_id]
            # 主||（不）比+宾+形---寻找作为ADV的”比“且“比”为动词
            if adv_bi['pos'] in verb_lst:
                type_id = 0
                return type_lst[type_id]

        # --寻找作为MT的“得”，另外寻找修饰“比”的“POB”结构
        if read_word(mt_info, ['得']) and read_hed(pob_info, adv_bi['word']):
            # 主||+动+宾+比+宾+重复的动词+得+形
            if hed_info['pos'] in verb_lst and hed_info['word'] in [key for key, value in dict(Counter(fenci_res)).items() if value > 1]:       # 是否存在重复动词
                type_id = 6
                return  type_lst[type_id]
            # 主||+动+（+宾+重复的动词）+得+比+宾+形
            if fenci_res.index("得") <  fenci_res.index("比"):        # 得在比前面
                type_id = 7
                return type_lst[type_id]
            else:
                # 主||+比+宾+动+得+宾
                type_id = 5
                return type_lst[type_id]

        # 主||+比+宾+动+宾---寻找作为ADV的“比”和作为HED的VOB，另外寻找作为比的“POB”结构
        if read_hed(vob_info, hed_info['word']) and read_hed(pob_info, adv_bi['word']):
            # 主||+比+宾+状[多/少/早/晚/先]+动（+宾/补）
            if read_word(adv_info,['多', '少', '早', '晚', '先']):
                type_id = 8
                return type_lst[type_id]
            else:
                type_id = 4
                return type_lst[type_id]


    # 主||“跟”+宾+“一样”--- "一样被识别为HED,"跟"作ADV修饰HED"
    if hed_info['word'] in ['一样','相同','一般'] and read_word(adv_info, ['跟','和','同']) and read_hed(adv_info,hed_info['word']):
        type_id = 9
        return type_lst[type_id]

    adv_yiyang = read_word(adv_info, ['一样','相同','一般'])
    adv_gen = read_word(adv_info, ['跟','和','同'])
    if adv_gen and adv_yiyang:
        # 主||“跟”+宾+“一样”+形/动词词组----"跟"作为ADV修饰“一样”，“一样”作为ADV修饰HED
        if adv_yiyang['hed_word'] == hed_info['word'] and adv_gen['hed_word'] == adv_yiyang['word']:
            type_id = 10
            return type_lst[type_id]
        # 主||动（+宾+重复的动词）+“得”+“跟”宾+“一样”+形
        if read_word(mt_info, ['得']) and adv_gen['hed_word'] in ['一样','相同','一般']:
            type_id = 11
            return type_lst[type_id]
    '''
       5.用“不如”表示比较
       （1）主 | |“不如”+宾
       （2）主 | |“不如”+宾 + 形/形容词词组/动词词组/主谓词组
       '''
    # 不如作为hed的情况
    if "不如" in fenci_res:
        # 先判断复杂情况（2)主 | |“不如”+宾 +形/形容词词组/动词词组/主谓词组
        if [vob for vob in vob_info if (fenci_res.index("不如") < vob['num'] < len(fenci_res) - 1)]:     # vob后面还有别的成分
            type_id = 13
            return type_lst[type_id]

        type_id = 12
        return type_lst[type_id]
    return type_lst[type_id]


if __name__ == '__main__':
    path = './data/test_compare.txt' #读取数据
    sentences = read_txt(path)
    for sent in sentences:
        print('*'*125)
        print(sent)
        fenci_res, pos_res, ddp_res = cut_sent(sent)
        pr = ParseResult(fenci_res, pos_res, ddp_res)
        print('分词：',fenci_res)
        print('词性：',pos_res)
        print('句法：',ddp_res)
        modifi_info = pr.get_modifi_info()
        hed_info = pr.get_hed_info()
        print(judge_type(hed_info,modifi_info,fenci_res,pos_res))
